package sifeap.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.util.Calendar;
import java.util.Random;
import java.util.ResourceBundle;

import javax.naming.InitialContext;

import sifeap.bl.ejb.parametros.ParametroBLLocal;
import sifeap.exception.SifeapException;

public class Util {

	/**
	 * Encripta una cadena utilizando el hash SHA-256
	 * 
	 * @param valor
	 * @return
	 */
	public static String encriptar(String valor) {
		byte[] digest = null;
		final byte[] buffer = valor.getBytes();
		try {
			final MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
			messageDigest.reset();
			messageDigest.update(buffer);
			digest = messageDigest.digest();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return toHexadecimal(digest);
	}

	private static String toHexadecimal(final byte[] digest) {
		String hash = "";
		for (byte aux : digest) {
			final int index = aux & 0xff;
			if (Integer.toHexString(index).length() == 1) {
				hash = hash.concat("0");
			}
			hash = hash.concat(Integer.toHexString(index));
		}
		return hash;
	}

	public static void escribirArchivo(String directorio, String nombreArchivo, InputStream inputStream) throws SifeapException  {
		try {
			OutputStream out = new FileOutputStream(new File(directorio + nombreArchivo));

			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = inputStream.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}

			inputStream.close();
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
			throw new SifeapException(e);
		}
	}
	
	public static boolean borrarArchivo(String directorio, String nombreArchivo) {
		boolean eliminado = false;
		try {
			File archivo = new File(directorio + nombreArchivo);
			
			if (archivo.exists()) {
				eliminado = archivo.delete();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return eliminado;
	}
	
	public static String obtenerAleatorio() {
		//Arma un aleatorio
		Calendar calendario = Calendar.getInstance();
		
		int minuto = calendario.get(Calendar.MINUTE);
		int segundo = calendario.get(Calendar.SECOND);
		int milisegundo = calendario.get(Calendar.MILLISECOND);
		
		Random aleatorio = new Random();
		int valorAleatorio = aleatorio.nextInt(11);
		
		String cadenaAleatoria = String.valueOf(minuto).concat(String.valueOf(segundo)).concat(String.valueOf(milisegundo)).concat(String.valueOf(valorAleatorio));
		
		return cadenaAleatoria;
	}
	
	public static String obtenerCadenaFecha() {
		Calendar calendario = Calendar.getInstance();
		
		int anno = calendario.get(Calendar.YEAR);
		int mes = calendario.get(Calendar.MONTH) + 1;
		int dia = calendario.get(Calendar.DATE);
		
		String cadena = String.valueOf(anno).concat(String.valueOf(mes < 10? "0" + mes : mes)).concat(String.valueOf(dia < 10? "0" + dia : dia));
		
		return cadena;
	}
	
	public static String obtenerValorParametro(String nombreParametro) throws SifeapException {
		String valor = null;
		try {
			ParametroBLLocal parametroBL = (ParametroBLLocal) new InitialContext().lookup("java:global/SifeapEAR/SifeapEJB/ParametroBL!" + ParametroBLLocal.class.getName());
			valor = parametroBL.obtenerValor(nombreParametro);
		} catch (Exception e) {
			e.printStackTrace();
			throw new SifeapException(e);
		}
		return valor;
	}

	/**
	 * Obtiene un mensaje a partir del properties
	 * @param etiquetas
	 * @param llave
	 * @return
	 */
	public static String obtenerMensaje(String etiquetas, String llave) {
		ResourceBundle mensajes = ResourceBundle.getBundle(etiquetas);
		String mensaje = mensajes.getString(llave);
		return mensaje;
	}
}
